/* exbuf.c */
#include "exbuf.h"
#include <ctype.h>

#define KEY_CARRIAGE 	10
#define KEY_BACKSPACE 	0407
#define KEY_LEFT	0404
#define KEY_RIGHT	0405
#define KEY_DC		0512

int ex_buf_add_key(ex_buf_t * buf, int key){
	if(isprint(key)){
		if(buf->len < BUF_CAP){
			if(buf->len == buf->cursor_pos){
				buf->data[buf->len++] = (char)key;
				buf->data[buf->len] = '\0';
			}else{
				int i;
				for(i = buf->len; i >= buf->cursor_pos; i--){
					buf->data[i+1]= buf->data[i];
				}
				buf->data[buf->cursor_pos] = (char)key;
				buf->len++;
			}
			buf->cursor_pos ++;
		}
	}else{
		switch(key){
		case KEY_CARRIAGE:
			return EX_OK;
			break;
		case KEY_BACKSPACE:
			if(buf->cursor_pos != 0){
				
				if(buf->len == buf->cursor_pos){
					buf->data[--(buf->len)]= '\0';
					buf->cursor_pos --;
				}else{
					int i;
					for(i = buf->cursor_pos; i <= buf->len; i++){
						buf->data[i-1] = buf->data[i];
					}
					buf->len --;
					buf->cursor_pos --;
				}
			}
			break;
		case KEY_DC:
			if(buf->cursor_pos < buf->len){
				int i;
				for(i = buf->cursor_pos+1; i <= buf->len; i++){
					buf->data[i-1] = buf->data[i];
				}
				buf->len --;
			}
			break;
		case KEY_LEFT:
			if(buf->cursor_pos != 0){
				buf->cursor_pos --;
			}
			break;
		case KEY_RIGHT:
			if(buf->cursor_pos < buf->len ){
				buf->cursor_pos++;
			}
			break;
		}
		
	}
	return 0;
}
